package com.project.les.view.elements;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Representação básica de um elemento de feriado para a View.
 * 
 * @author saulo
 */
public class FeriadoViewElement {

	/**
	 * ID do feriado para faciligar buscas posteriores no Banco de Dados.
	 */
	private Integer id;

	/**
	 * O dia do feriado.
	 */
	private Integer day;

	/**
	 * O mês do feriado.
	 */
	private Integer month;

	/**
	 * O ano do feriado.
	 */
	private Integer year;

	/**
	 * O estado do feriado.
	 */
	private String state;

	/**
	 * A cidade do feriado.
	 */
	private String city;

	/**
	 * O nome do feriado.
	 */
	private String name;

	/**
	 * A descrição do feriado.
	 */
	private String description;

	private Integer isNacional;
	private Integer isState;

	/**
	 * Construtor do elemento.
	 * 
	 * @param id
	 *            O ID do feriado para faciligar buscas posteriores no Banco de
	 *            Dados.
	 * @param day
	 *            O dia do feriado.
	 * @param month
	 *            O mês do feriado.
	 * @param year
	 *            O ano do feriado.
	 * @param name
	 *            O nome do feriado.
	 * @param description
	 *            A descrição do feriado.
	 */
	public FeriadoViewElement(Integer id, Integer day, Integer month,
			Integer year, String name, String state, String city,
			String description, Integer isNacional, Integer isState) {
		this.id = id;
		this.day = day;
		this.month = month;
		this.year = year;
		this.name = name;
		this.state = state;
		this.city = city;
		this.description = description;
		this.isNacional = isNacional;
		this.isState = isState;
	}

	/**
	 * Retorna o ID do feriado.
	 * 
	 * @return O ID do feriado.
	 */
	public Integer getId() {
		return this.id;
	}

	/**
	 * Retorna o dia do feriado.
	 * 
	 * @return O dia do feriado.
	 */
	public Integer getDay() {
		return this.day;
	}

	/**
	 * Retorna o mês do feriado.
	 * 
	 * @return O mês do feriado.
	 */
	public Integer getMonth() {
		return this.month;
	}

	/**
	 * Retorna o ano do feriado.
	 * 
	 * @return O ano do feriado.
	 */
	public Integer getYear() {
		return this.year;
	}

	/**
	 * Retorna o nome do feriado.
	 * 
	 * @return O nome do feriado.
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Retorna o nome do feriado.
	 * 
	 * @return O nome do feriado.
	 */
	public String getState() {
		return this.state;
	}

	/**
	 * Retorna o nome do feriado.
	 * 
	 * @return O nome do feriado.
	 */
	public String getCity() {
		return this.city;
	}

	/**
	 * Retorna a descrição do feriado.
	 * 
	 * @return A descrição do feriado.
	 */
	public String getDescription() {
		return this.description;
	}

	/**
	 * Retorna a representação em GregorianCalendar da data
	 * 
	 * @return A representação em GregorianCalendar da data
	 */
	public GregorianCalendar getDate() {
		GregorianCalendar date = new GregorianCalendar(getYear(),
				getMonth() - 1, getDay());
		return date;
	}

	private boolean isNacional() {
		return this.isNacional == 1;
	}

	private boolean isState() {
		return this.isState == 1;
	}

	public String getType() {
		if (isNacional())
			return "Nacional";
		if (isState())
			return "Estadual";
		return "Municipal";
	}

	public String getMissingDay() {
		GregorianCalendar currentCalendar = new GregorianCalendar();
		int missing_days = this.getDate().get(Calendar.DAY_OF_YEAR)
				- currentCalendar.get(Calendar.DAY_OF_YEAR);
		if(missing_days > 0)
			return "Faltam " + missing_days + " dia(s) para o feriado.";
		if(missing_days == 0)
			return "Feriado hoje.";
		return "Feriado já passou.";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((city == null) ? 0 : city.hashCode());
		result = prime * result + ((day == null) ? 0 : day.hashCode());
		result = prime * result + ((month == null) ? 0 : month.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((state == null) ? 0 : state.hashCode());
		result = prime * result + ((year == null) ? 0 : year.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		FeriadoViewElement other = (FeriadoViewElement) obj;
		if (city == null) {
			if (other.city != null)
				return false;
		} else if (!city.equals(other.city))
			return false;
		if (day == null) {
			if (other.day != null)
				return false;
		} else if (!day.equals(other.day))
			return false;
		if (month == null) {
			if (other.month != null)
				return false;
		} else if (!month.equals(other.month))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (state == null) {
			if (other.state != null)
				return false;
		} else if (!state.equals(other.state))
			return false;
		if (year == null) {
			if (other.year != null)
				return false;
		} else if (!year.equals(other.year))
			return false;
		return true;
	}
	
	

}
